4. 数猫をパソコンの画面に表示する
https://gyazo.com/a319597671132b933ff93372e1da9e5f
このプログラムでは、数猫の問題をウィンドウを開いて表示できるようにするために、マス目を描画してマス目の中に大小の数字を書き込む機能をもつオブジェクトを生成するクラスBaseboardを定義します。このコードはPython3.*系で書かれています。Python2.*の場合は、最初のインポート文のtkinterをTkinterに変更すれば動きます。
code: baseboard.py
from tkinter import Tk, Canvas
class BaseBoard(object):
def __init__(self, base, CellSize = 60):
self.CellSize = CellSize
Margine = CellSize // 2
self.origine = Margine
CanvasSize = CellSize * 9 + Margine * 2
self.f = lambda i: Margine + CellSize * i
self.myCanvas = Canvas(base,background = 'white',
width = CanvasSize, height = CanvasSize)
self.myCanvas.pack()
self.background(self.myCanvas, self.f)
self.grid(self.myCanvas, self.f)
def background(self, canvas, f):
for i in range(3):
for j in range(3):
canvas.create_rectangle(f(i * 3), f(j * 3),
f((i + 1) * 3), f((j + 1) * 3),
def grid(self, canvas, f):
for i in range(10):
canvas.create_line(f(i), f(0), f(i), f(9))
canvas.create_line(f(0), f(i), f(9), f(i))
canvas.create_line(f(i), f(0), f(i), f(9), width = 2)
canvas.create_line(f(0), f(i), f(9), f(i), width = 2)
canvas.create_rectangle(f(0), f(0), f(9), f(9), width = 4)
def fill_large(self, i, j, n, fill = 'black'):
canvas = self.myCanvas
size = self.CellSize
g = lambda i: self.f(i) + self.CellSize / 2
obj = canvas.create_text(g(j), g(i), text = '%s' % n,
font = ('Arial', size),
width = size,
fill = fill)
return obj
def fill_small(self, i, j, n, fill = 'grey50'):
size = self.CellSize // 3
canvas = self.myCanvas
x, y = self.ijn2xy(size, i, j, n)
obj = canvas.create_text(x, y, text = '%s' % n,
font = ('Arial', size),
width = size,
fill = fill)
return obj
def ijn2xy(self, size, i, j, n):
x = self.f(j) + ((n - 1) % 3) * size + size // 2
y = self.f(i + 1) - ((n - 1) // 3) * size - size // 2
return x, y
def xy2ijn(self, size, x, y):
j, i = (x - self.origine) // self.CellSize, (y - self.origine) // self.CellSize
u, v = x - j * self.CellSize - self.origine, y - i * self.CellSize - self.origine
n = u // size + 1 + 3 * ((self.CellSize - v) // size)
return i, j, n
if __name__ == "__main__":
myTk = Tk()
suuneko = BaseBoard(myTk)
for i in range(9):
for j in range(9):
if n:
suuneko.fill_large(i, j, n)
else:
for n in range(1, 10):
suuneko.fill_small(i, j, n)
myTk.mainloop()
クラス変数:
bg 背景の色
CellSize マス目の大きさ
origin起点(上下左右のマージンに等しい)
f i番目のマス目の起点
myCanvasCanvasクラスのオブジェクト
メソッド:
background背景色を描画する
gridマス目を描画する
fill_small 小さな数字をマス目に描画する
fill_large大きな数字をマス目に描画する
ijn2xy小さな数字を描画する座標を計算する
xy2ijn座標からそこに描画される小さな数字を取得する